Use case: Starting a write/read in DMA mode for regular memory

Starting a write/read operation in DMA mode for regular memory.

Sequence diagram

Starting a write/read operation in DMA mode for regular memory

  @startuml

    == Initialization and configuration ==

    == Process DMA mode ==
    "Application" -> "OSPI" : HAL_OSPI_Command()/HAL_OSPI_HyperbusCmd()
    note right: Reconfigure write operation
    "OSPI" --> "Application" :

    "Application" -> "OSPI" : HAL_OSPI_Transmit_DMA()
    note right: Start DMA channel transfer with interrupt enabled
    "IRQHandler" <-  : Interrupt
    "IRQHandler" -> "DMA" : HAL_DMA_IRQHandler()
    "DMA" -> "OSPI" : DMA_Trasfer_Complete
    "OSPI" --> "Application" : HAL_OSPI_TxCpltCallback()

    "Application" -> "OSPI" : HAL_OSPI_Command()/HAL_OSPI_HyperbusCmd()
    "Application" -> "OSPI" : HAL_OSPI_AutoPolling_IT()
    note right : Reconfigure OSPI to AutoPolling mode to wait end of operation

    "IRQHandler" <-  : Interrupt
    "IRQHandler" --> "OSPI" : HAL_OSPI_IRQHandler()
    "OSPI" --> "Application" : HAL_OSPI_StatusMatchCallback()

    "Application" -> "OSPI" : HAL_OSPI_Command()/HAL_OSPI_HyperbusCmd()
    note right: Reconfigure read operation
    "OSPI" --> "Application" :

    "Application" -> "OSPI" : HAL_OSPI_Receive_DMA()
    note right: Start DMA channel transfer with interrupt enabled

    "IRQHandler" <-  : Interrupt
    "IRQHandler" -> "DMA" : HAL_DMA_IRQHandler()
    "DMA" -> "OSPI" : DMA_Transfer_Complete
    "OSPI" --> "Application" : HAL_OSPI_RxCpltCallback()


    @enduml

Code snippet

HAL1

HAL2

OSPI_HandleTypeDef ospi;
OSPI_RegularCmdTypeDef scommand = {0};

scommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;
scommand.InstructionMode    = HAL_OSPI_INSTRUCTION_8_LINES;
scommand.InstructionWidth   = HAL_OSPI_INSTRUCTION_8_BITS;
scommand.InstructionDTRMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
scommand.Instruction        = WRITE_REG_CMD;
scommand.AddressMode        = HAL_OSPI_ADDRESS_8_LINES;
scommand.AddressWidth       = HAL_OSPI_ADDRESS_32_BITS;
scommand.AddressDTRMode     = HAL_OSPI_ADDRESS_DTR_ENABLE;
scommand.AlternateBytesMode = HAL_OSPI_ALT_BYTES_NONE;
scommand.DataMode           = HAL_OSPI_DATA_8_LINES;
scommand.DataDTRMode        = HAL_OSPI_DATA_DTR_ENABLE;
scommand.DataLength         = 2;
scommand.DummyCycles        = 0;
scommand.DQSMode            = HAL_OSPI_DQS_DISABLE;





HAL_OSPI_Command(&ospi, &scommand, OSPI_TIMEOUT);

HAL_OSPI_Transmit_DMA(&ospi, data);

HAL_DMA_IRQHandler(&ospi);

HAL_OSPI_TxCpltCallback(&ospi);

HAL_OSPI_Command(&ospi, &command, OSPI_TIMEOUT);






HAL_OSPI_AutoPolling_IT(&ospi, &sConfig);

ospi_IRQHandler(&ospi);

HAL_OSPI_StatusMatchCallback(&ospi);

HAL_OSPI_Command(&ospi, &command, OSPI_TIMEOUT);

HAL_OSPI_Receive_DMA(&ospi, (uint8_t *)aRxBuffer);

HAL_DMA_IRQHandler(&ospi);

HAL_OSPI_RxCpltCallback(&ospi);


void HAL_OSPI_TxCpltCallback(OSPI_HandleTypeDef *ospi)
{
  // USER CODE
}

void HAL_OSPI_RxCpltCallback(OSPI_HandleTypeDef *ospi)
{
  // USER CODE
}
hal_xspi_handle_t xspi;


command.operation_type = HAL_XSPI_OPERATION_COMMON_CFG;
command.io_select = HAL_XSPI_IO_7_0;
command.alternate_bytes = 0U;
command.alternate_bytes_width = HAL_XSPI_ALTERNATE_BYTES_8BIT;
command.alternate_bytes_mode = HAL_XSPI_ALTERNATE_BYTES_NONE;
command.alternate_bytes_dtr_mode_status = HAL_XSPI_ALTERNATE_BYTES_DTR_DISABLED;
/* Specific parameters for the Sector Erase command */
command.instruction = WRITE_REG_CMD;
command.instruction_mode = HAL_XSPI_INSTRUCTION_8LINES;
command.instruction_width = HAL_XSPI_INSTRUCTION_32BIT;
command.instruction_dtr_mode_status = HAL_XSPI_INSTRUCTION_DTR_DISABLED;
command.addr = MX25_FIRST_BLOCK_ADDR;
command.addr_mode = HAL_XSPI_ADDR_8LINES;
command.addr_width = HAL_XSPI_ADDR_8BIT;
command.addr_dtr_mode_status = HAL_XSPI_ADDR_DTR_ENABLED;
command.data_mode = HAL_XSPI_REGULAR_DATA_NONE;
command.data_dtr_mode_status = HAL_XSPI_DATA_DTR_ENABLED;
command.dummy_cycle = 0;
command.dqs_mode_status = HAL_XSPI_DQS_DISABLED;
command.size_byte = 2;
HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);

HAL_XSPI_Transmit_DMA(xspi, data);

HAL_DMA_IRQHandler(xspi);

HAL_XSPI_TxCpltCallback(xspi);

HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);

sConfig.MatchMode           = HAL_XSPI_MATCH_MODE_AND;
sConfig.AutomaticStop       = HAL_XSPI_AUTOMATIC_STOP_ENABLE;
sConfig.IntervalTime        = 0x10;
sConfig.MatchMask           = WRITE_ENABLE_MASK_VALUE;
sConfig.MatchValue          = WRITE_ENABLE_MATCH_VALUE;
HAL_XSPI_ExecRegularAutoPoll_IT(xspi, &sConfig);

xspi_IRQHandler(&xspi);

HAL_XSPI_StatusMatchCallback(&xspi);

HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);

HAL_XSPI_Receive_DMA(&xspi, (uint8_t *)aRxBuffer);

HAL_DMA_IRQHandler(&xspi);

HAL_XSPI_RxCpltCallback(&xspi);


void HAL_XSPI_TxCpltCallback(XSPI_HandleTypeDef *hxspi)
{
  // USER CODE
}

void HAL_XSPI_RxCpltCallback(XSPI_HandleTypeDef *hxspi)
{
  // USER CODE
}

Key changes

  1. In HAL2, OSPI DMA APIs are replaced by XSPI DMA APIs (for example, HAL_OSPI_Transmit_DMA() becomes HAL_XSPI_Transmit_DMA()).

  2. In HAL2, automatic polling in interrupt mode uses HAL_XSPI_ExecRegularAutoPoll_IT().